package com.example.springshell.demo;

import org.springframework.shell.Availability;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.standard.ShellMethodAvailability;

/**
 * @description 动态命令可用性检查
 * @author maliqiang
 * @version 1.0
 * @date 2017年12月4日
 */
@ShellComponent
public class RunTwiceToEnableApp {
  private boolean run = false;
 
  @ShellMethod("Run once")
  public void runOnce() {
    this.run = true;
  }
 
  @ShellMethod("Run again")
  @ShellMethodAvailability(value = "runAgainCheck")
  public void runAgain() {
    System.out.println("Run!");
  }

  /**
   * 按照命名惯例，检查命令可用性的方法的名称是在命令方法名称之后加上 Availability 后缀。
   */
  public Availability runAgainAvailability() {
    return run
        ? Availability.available()
        : Availability.unavailable("You should run runOnce first!");
  }

  /**
   * 如果需要使用不同的方法名称，
   * 或是由一个检查方法控制多个方法，可以在检查方法上添加注解@ShellMethodAvailability 来声明其控制的方法名称。
   *
   * @return
   */
  public Availability runAgainCheck() {
    return run
            ? Availability.available()
            : Availability.unavailable("You should run runOnce first!");
  }
}